package ljl.alg.wangzheng_camp.round1.bitwise;

/**
 * 把 m 插入到 n 的 i~j 位
 * */
public class _05_01_insert_bits {
    
    /**
     * 我思路是搞一个 mask 不停往左移动，到 j 就停止
     * 它得和 N 求与
     *
     * 我去你妈的！过辣！
     *
     * */
    public int insertBits(int N, int M, int i, int j) {
        int mask = 1 << i;
        for (int k = i; k <= j; k++) {
            if ((M & 1) == 1) N |= mask;
            else N &= ~mask;
            M >>>= 1;
            mask <<= 1;
        }
        return N;
    }
    
    /**
     * 看看狱友是怎么写的
     * N i-j 置零
     * M 左移 i 位，然后两者相加
     * */
    public int insertBits2(int N, int M, int i, int j) {
        int mask = 1 << i;
        for (int k = i; k <= j ; k++) {
            N &= ~mask;
            mask <<= 1;
        }
        M <<= i;
        return M + N;
    }
    
}
